package com.xbongbong.saas.service;

import com.xbongbong.paas.pojo.dto.FormDataDeleteBatchDTO;
import com.xbongbong.paas.pojo.dto.FormDataGetDTO;
import com.xbongbong.paas.pojo.dto.FormDataListDTO;
import com.xbongbong.paas.pojo.vo.PaasFormDataEsListVO;
import com.xbongbong.paas.pojo.vo.PaySheetFromBalanceListVO;
import com.xbongbong.paas.pojo.vo.PrePayBalanceListVO;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.pro.applist.pojo.vo.ListAppVO;
import com.xbongbong.pro.formdata.pojo.dto.FormDataDetailDTO;
import com.xbongbong.pro.formdata.pojo.vo.FormDataDetailVO;
import com.xbongbong.pro.formdata.pojo.vo.MobileFormCommonDetailVO;
import com.xbongbong.pro.paybalance.pojo.dto.PaySheetFromBalanceDTO;
import com.xbongbong.pro.sheet.pojo.dto.SheetDeleteHandleRelateDTO;
import com.xbongbong.saas.domain.entity.ext.PayPlanSheetEntityExt;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 预付款余额处理业务
 *
 * @author 徐俊杰
 * @date 2020/2/25 9:47
 * @since v1.0
 */
public interface PayBalanceService {

    /**
     * 预付款余额列表
     * 
     * @param formDataListDTO 列表页统一入参
     * @return com.xbongbong.paas.pojo.vo.PrePaymentBalanceListVO
     * @throws XbbException 异常
     * @author 徐俊杰
     * @date 2020/2/25 9:51
     * @since v1.0
     */
    PrePayBalanceListVO prepayBalanceList(FormDataListDTO formDataListDTO) throws XbbException;

    /**
     * 预付款余额APP列表
     * 
     * @param formDataListDTO 列表页统一入参
     * @return com.xbongbong.pro.applist.pojo.vo.ListAppVO
     * @throws XbbException 异常
     * @author 徐俊杰
     * @date 2020/2/25 9:55
     * @since v1.0
     */
    ListAppVO prepayBalanceAppList(FormDataListDTO formDataListDTO) throws XbbException;
    
    /**
     * 移动端detail
     * 
     * @param formDataGetDTO 详情页（APP）统一入参
     * @return com.xbongbong.pro.formdata.pojo.vo.MobileFormCommonDetailVO
     * @throws XbbException 异常
     * @author 徐俊杰
     * @date 2020/2/25 9:59
     * @since v1.0
     */
    MobileFormCommonDetailVO getMoblieDetail(FormDataGetDTO formDataGetDTO) throws XbbException;
    
    /**
     * web端detail
     * 
     * @param formDataDetailDTO 详情页（WEB）统一入参
     * @return com.xbongbong.pro.formdata.pojo.vo.FormDataDetailVO
     * @throws XbbException 异常
     * @author 徐俊杰
     * @date 2020/2/25 10:01
     * @since v1.0
     */
    FormDataDetailVO getWebDetail(FormDataDetailDTO formDataDetailDTO) throws XbbException;

    /**
     * 详情tab里的付款单列表（预付款，红冲预付款余额，预付款核销）
     * 
     * @param paySheetFromBalanceDTO 入参（包含供应商id）
     * @return com.xbongbong.paas.pojo.vo.PaySheetFromBalanceListVO
     * @throws XbbException 异常
     * @author 徐俊杰
     * @date 2020/2/25 10:11
     * @since v1.0
     */
    PaySheetFromBalanceListVO paySheetFromBalanceList(PaySheetFromBalanceDTO paySheetFromBalanceDTO) throws XbbException;

    /**
     * 在选择关联供应商时展示的关联供应商列表，查询到供应商的可核销余额，目前是只支持查询供应商的余额
     *
     * @param formDataListVO
     * @param corpid 公司id
     * @throws XbbException 异常
     * @author 徐俊杰
     * @date 2020/2/25 10:15
     * @since v1.0
     */
    void getSupplementAmount(PaasFormDataEsListVO formDataListVO, String corpid) throws XbbException;

    /**
     * 批量删除预付款余额记录（保证余额=0才能删除）
     *
     * @param idIn 主键id集合
     * @param corpid 公司id
     * @return java.lang.Integer
     * @throws XbbException 异常
     * @author 徐俊杰
     * @date 2020/2/25 10:24
     * @since v1.0
     */
    Integer deleteBatch(List<Long> idIn, String corpid) throws XbbException;

    /**
     * 回滚预付款余额(del的修改)
     *
     * @param idIn 主键id集合
     * @param corpid 公司id
     * @throws XbbException 异常
     * @author 徐俊杰
     * @date 2020/2/25 10:25
     * @since v1.0
     */
    void updateRollback(List<Long> idIn, String corpid) throws XbbException;

    /**
     * 删除付款单时，同步更新供应商的余额。目前，有3种付款单类型删除会影响余额：
     * 预付款（无明细，且无关联采购合同、无关联付款计划）：供应商余额减少
     * 预付款核销、红冲预付款余额（可能有明细）：供应商余额增加
     *
     * 因此，如果导致该供应商余额小于0，则该供应商对应的预付款类型的付款单不能删除（因只有预付款类型删除是对供应商余额减少）
     *
     * @param corpid 公司id
     * @param errorTypeSet 不允许删除类型
     * @param errorDataSet 不允许删除数据
     * @param customerIdSet 供应商id集合
     * @param prepaymentNoMap 供应商id-预付款类型付款单编号list对应关系map，与sheetIdMap对应
     * @param prepaymentIdMap 供应商id-预付款类型付款单id list对应关系map，与sheetNoMap对应
     * @param delIdList 要删除的付款单id集合（当某个供应商因余额小于0而其关联的所有预付款类型的付款单不能被删除时，要把其对应的ids从该list移除）
     * @param sheetDeleteHandleRelateDTO 删除/批量删除付款单，更新其关联业务（供应商、采购合同、付款计划）dto
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    void updatePayBalance4Del(String corpid, Set<String> errorTypeSet, Set<String> errorDataSet, Set<Long> customerIdSet, Map<Long, List<String>> prepaymentNoMap, Map<Long, List<Long>> prepaymentIdMap, List<Long> delIdList, SheetDeleteHandleRelateDTO sheetDeleteHandleRelateDTO) throws XbbException;

    /**
     * 一致性同步
     * @param corpid 公司ID
     * @param supplierId 供应商id
     * @param supplierName 供应商名称
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    void dataConsistencyUpdateSupplier(String corpid, Long supplierId, String supplierName) throws XbbException;

    /**
     * 通过供应商id回滚es：如果新增的预付款余额，则删除es；如果原是对原预付款余额修改，则读库同步至es
     * @param supplierId
     * @param corpid
     * @throws XbbException
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    void updateRollbackBySupplierId(Collection<Long> supplierId, String corpid) throws XbbException;

    /**
     * 删除预付款，之所以不用deleteBatch，是因为在删除之前会有一些业务判断，为了不影响之前的业务，重新写一个方法，里面调用deleteBatch
     *
     * @param formDataDeleteBatchDTO
     */
    List<Long> deletePayBalanceBatch(FormDataDeleteBatchDTO formDataDeleteBatchDTO) throws XbbException;
}
